Spring整合Mybatis原理

您所在的位置:网站首页 spring 整合mybatis Spring整合Mybatis原理

Spring整合Mybatis原理

#Spring整合Mybatis原理| 来源: 网络整理| 查看: 265

Spring整合Mybatis原理

目录Spring整合Mybatis原理1、@MapperScan注解发挥作用1.1、导入MapperScannerRegistrar类1.1.2、执行ImportBeanDefinitionRegistrar接口中的registerBeanDefinitions方法1.2、ClassPathMapperScanner1.2.1、对筛选出来的BeanDefinition进行处理1.3、SqlSessionFactoryBean类结构体系1.3.1、SqlSessionFactoryBean使用1.4、SqlSessionTemplate1.4.1、构造方法1.4.2、增删改查方法1.4.3、SqlSessionInterceptorSpring整合Mybatis后为什么一级缓存失效sqlsession的提交和回滚在哪里流程三、总结Mybatis-Spring 新版本底层源码执行流程

1、@MapperScan注解发挥作用

在Spring整合Mybatis的时候,只需要一个@MapperScan注解就可以来进行操作,所以更加好奇的是@MapperScan底层是怎么来做到的。

下面先来研究一下@MapperScan:

@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @Documented @Import(MapperScannerRegistrar.class) @Repeatable(MapperScans.class) public @interface MapperScan { ... }

@Import注解导入了一个MapperScannerRegistrar。而在Spring启动的时候,会在org.Springframework.context.support.AbstractApplicationContext#refresh方法中会来执行@Import导入的类,看下如何来解析@Import注解的。直接来到org.Springframework.context.annotation.ConfigurationClassBeanDefinitionReader#loadBeanDefinitionsForConfigurationClass会来解析@Import注解导入进来的类,那么下面就需要来看一下MapperScannerRegistrar做了什么事情。

1.1、导入MapperScannerRegistrar类

下面来看一下MapperScannerRegistrar的结构体系

1.1.2、执行ImportBeanDefinitionRegistrar接口中的registerBeanDefinitions方法

MapperScannerRegistrar类实现了ImportBeanDefinitionRegistrar接口,而实现了接口中的方法,那么在注册BeanDefinition之前,就会来执行ImportBeanDefinitionRegistrar接口中的方法

default void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { }

那么只需要看一下MapperScannerRegistrar中的registerBeanDefinitions方法是如何来进行实现的:

1.2、MapperScannerConfigurer

而在上面的代码中,主要是注册了一个MapperScannerConfigurer类型的BeanDefinition。

那么来看一下这个BeanDefinition有什么特点:

MapperScannerRegistrar实现了BeanDefinitionRegistryPostProcessor接口。而这个接口中又会在ConfigurationClassPostProcessor之后发挥作用,而MapperScannerRegistrar对应的BeanDefinition是在此之前来进行解析的,所以将会在下面来解析MapperScannerRegistrar对应的BeanDefinition

那么就会来执行MapperScannerConfigurer中的postProcessBeanDefinitionRegistry方法

1.2、ClassPathMapperScanner

那么看一下Spring-Mybatis中自定义整合的ClassPathMapperScanner中的注册过滤器和扫描逻辑:

将扫描出来的类利用包含过滤器添加到当前逻辑中。

那么来看一下扫描逻辑:

然后可以看到只要接口的类

1.2.1、对筛选出来的BeanDefinition进行处理

然后对扫描出来的接口来进行筛选判断:

org.mybatis.Spring.mapper.ClassPathMapperScanner#processBeanDefinitions

1、首先获取得到接口的全限定类型。如:com.guang.dao.UserDao;

2、将当前的BeanClass设置成MapperFactoryBean,而这个类是FactoryBean类型的。在创建对象的时候,说明是要用getObject方法来创建对象的;

3、设置MapperFactoryBean构造函数中的值。在MapperFactoryBean构造函数中是Class类型,而这里设置的是String,在创建的时候Spring回来进行转换;

4、将MapperFactoryBean的注入模型设置为By-Type。也就是说,MapperFactoryBean中的setXxx中的属性会从容器中来进行查找;

那么看一下MapperFactoryBean的构造方法:

public MapperFactoryBean(Class mapperInterface) { this.mapperInterface = mapperInterface; }

这里会将mapperInterface在进行赋值的时候将java.lang.String转换成Class类型,表示对应的接口。

第二个:

说明了在MapperFactoryBean中的setXxxx方法对应的xxx属性,Spring会自动来进行赋值。而MapperFactoryBean继承了SqlSessionDaoSupport,在SqlSessionDaoSupport类中的set方法中存在setSqlSessionFactory方法和setSqlSessionTemplate方法,所以容器中如果存在着对应类型的对象的时候,那么Spring到时候来进行赋值的时候将会从容器中来进行获取得到对应的bean。

所以:SqlSessionTemplate我们可以自己配置,但是SqlSessionFactory就得由我们自己来进行配置了。

1.3、SqlSessionFactoryBean类结构体系

SqlSessionFactoryBean类就是来帮我们创建SqlSessionFactory,看下SqlSessionFactory的结构如下所示:

SqlSessionFactoryBean也是一个FactoryBean类型的,产生的对象的类型是:SqlSessionFactory。

看一下对应的getObjectType方法:

public Class


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3